/* Soubor je ulozen v kodovani UTF-8.
 * Kontrola kódování: Příliš žluťoučký kůň úpěl ďábelské ódy.
 */
package cz.pecinovsky.english.pojj.adv_framework.game_txt;

import cz.pecinovsky.english.pojj.adv_framework.scenario.AScenarioManager;

import java.util.Collection;



/*******************************************************************************
 * Instance rozhraní {@code IGame} mají na starosti logiku hry.
 * Jsou schopny akceptovat jednotlivé příkazy a poskytovat informace
 * o průběžném stavu hry a jejích součástech.
 * <p>
 * Třída hry musí být navíc definována jako jedináček (singleton)
 * a kromě metod deklarovaných v tomto rozhraní musí definovat
 * statickou tovární metodu {@code getGame()} nebo {@code getInstance()}.
 * Splnění této podmínky nemůže prověřit překladač,
 * ale prověří ji až následné testy hry.
 *
 * @author    Rudolf PECINOVSKÝ
 * @version   5.0
 */
public interface IGame extends IAuthor
{
//== VEŘEJNÉ KONSTANTY =========================================================
//== DEKLAROVANÉ METODY ========================================================

    /***************************************************************************
     * Vrátí odkaz na aktuální prostor,
     * tj. na prostor, v němž se pravé nachází hráč.
     *
     * @return Požadovaný odkaz
     */
//    @Override
    public IPlace getActualPlace();


    /***************************************************************************
     * Vrátí odkaz na batoh, do nějž bude hráč ukládat sebrané objekty.
     *
     * @return Požadovaný odkaz
     */
//    @Override
    public IBag getBag();


    /***************************************************************************
     * Vrátí kolekci odkazů na jednotlivé prostory.
     *
     * @return Požadovaná kolekce
     */
//    @Override
    public Collection<? extends IPlace> getAllPlaces();


    /***************************************************************************
     * Vrátí kolekci všech příkazů použitelných ve hře.
     *
     * @return Požadovaná kolekce
     */
//    @Override
    public Collection<? extends ICommand> getAllCommands();


    /***************************************************************************
     * Vrátí informaci o tom, je-li hra již ukončena
     * a je proto schopna být spuštěna znovu.
     *
     * @return Požadovaná informace
     */
//    @Override
    public boolean isReady();


    /***************************************************************************
     * Vrátí správce scénářů, které umožní prověřit funkčnost hry
     * a/nebo demonstrovat její průběh.
     *
     * @return Správce scénářů dané hry
     */
//    @Override
    public AScenarioManager getScenarioManager();


    /***************************************************************************
     * Ukončí celou hru a vrátí alokované prostředky.
     */
//    @Override
    public void stop();


    /***************************************************************************
     * Zpracuje zadaný příkaz a vrátí text zprávy pro uživatele.
     *
     * @param command Zadávaný příkaz
     * @return Textová odpověď hry na zadaný příkaz
     */
//    @Override
    public String executeCommand(String command);



//== ZDĚDĚNÉ METODY ============================================================
//== INTERNÍ DATOVÉ TYPY =======================================================

    /***************************************************************************
     * Třída {@code Adapter} slouží ke snadnějšímu vývoji tříd
     * implementujících rozhraní {@link IGame}, protože poskytují
     * definice všech metod vyžadovaných tímto rozhraním. Uplatní se v etapě,
     * kdy je již definován plnohodnotný {@link AScenarioManager}
     * a hra se postupně buduje hra tak, aby těmito scénáři úspěšně prošla.
     *
     * @author    Rudolf PECINOVSKÝ
     * @version   0.00.000
     */
    public static class Adapter implements IGame
    {
    //== KONSTANTNÍ ATRIBUTY TŘÍDY =============================================
    //== PROMĚNNÉ ATRIBUTY TŘÍDY ===============================================
    //== STATICKÝ INICIALIZAČNÍ BLOK - STATICKÝ KONSTRUKTOR ====================
    //== KONSTANTNÍ ATRIBUTY INSTANCÍ ==========================================

        /** Jméno autora/autorky scénáře. */
        private final String autor;

        /** X-name autora/autorky scénáře. */
        private final String xname;

        /** Správce scénářů dané hry. */
        private final AScenarioManager správceScénářů;



    //== PROMĚNNÉ ATRIBUTY INSTANCÍ ============================================
    //== PŘÍSTUPOVÉ METODY VLASTNOSTÍ TŘÍDY ====================================
    //== OSTATNÍ NESOUKROMÉ METODY TŘÍDY =======================================

    //##########################################################################
    //== KONSTRUKTORY A TOVÁRNÍ METODY =========================================

        /***********************************************************************
         * Třída definuje rodiče pro případný prototyp budoucí hry
         * určený pouze pro testování scénářů plánované hry.
         * Tento prototyp bude používat správce scénářů do doby,
         * než uživatel vytvoří hru schpnou řádného testování.
         *
         * @param autor Jméno autora/autorky programu ve tvaru PŘÍJMENÍ Křestní
         * @param xname X-name autora/autorky programu vyhovující požadavkům
         *              definovaným v kontraktu metody
         *              {@link IAuthor.getXNAME()}.
         * @param správceScénářů Správnce scénářů vytvářené hry
         */
        public Adapter(String autor, String xname,
                       AScenarioManager správceScénářů)
        {
            this.autor          = autor;
            this.xname          = xname;
            this.správceScénářů = správceScénářů;
        }



    //== ABSTRAKTNÍ METODY =====================================================
    //== PŘÍSTUPOVÉ METODY VLASTNOSTÍ INSTANCÍ =================================

        /** {@inheritDoc} */
        @Override public String getAuthor() {
            return autor;
        }
        /** {@inheritDoc} */
        @Override public String getXNAME() {
            return xname;
        }
        /** {@inheritDoc} */
        @Override public AScenarioManager getScenarioManager() {
            return správceScénářů;
        }

        /** {@inheritDoc} */
        @Override public IPlace getActualPlace() {
            throw new UnsupportedOperationException("Not supported yet.");
        }
        /** {@inheritDoc} */
        @Override public IBag getBag() {
            throw new UnsupportedOperationException("Not supported yet.");
        }
        /** {@inheritDoc} */
        @Override public Collection<? extends IPlace> getAllPlaces() {
            throw new UnsupportedOperationException("Not supported yet.");
        }
        /** {@inheritDoc} */
        @Override public Collection<? extends ICommand> getAllCommands() {
            throw new UnsupportedOperationException("Not supported yet.");
        }
        /** {@inheritDoc} */
        @Override public boolean isReady() {
            throw new UnsupportedOperationException("Not supported yet.");
        }


    //== OSTATNÍ NESOUKROMÉ METODY INSTANCÍ ====================================

        /** {@inheritDoc} */
        @Override public void stop() {
            throw new UnsupportedOperationException("Not supported yet.");
        }
        /** {@inheritDoc} */
        @Override public String executeCommand(String příkaz) {
            throw new UnsupportedOperationException("Not supported yet.");
        }



    //== SOUKROMÉ A POMOCNÉ METODY TŘÍDY =======================================
    //== SOUKROMÉ A POMOCNÉ METODY INSTANCÍ ====================================
    //== INTERNÍ DATOVÉ TYPY ===================================================
    //== TESTOVACÍ METODY A TŘÍDY ==============================================
    }

}
